/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Serwer;

import java.io.IOException;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Collections;
import java.util.ListIterator;
import java.util.Random;
import java.util.Vector;

/**
 *
 * @author cigol
 */
public class Rozgrywka {




    private ArrayList <Integer> karty;
    private int iloscKart;
    Vector <Gracz> gracze = new Vector <Gracz>();
    private Integer pulaWejsciowa;
    private Integer diler;
    private Integer stawka;
    private Integer zwyciezca;
    private Vector<Integer> licytujacyGracze;
    private Integer aktualnyLicytujacy;
    private Integer numerTury;

    public Rozgrywka() {
        diler = -1;
        zwyciezca = -1;
        stawka = 0;
        numerTury = 0;
        
        karty = new ArrayList<Integer>();
        licytujacyGracze = new Vector <Integer>();

    }

    public void nowaTura()
    {
        ++numerTury;
        for (int i=0;i<gracze.size();++i)
            gracze.get(i).setStawka(0);
        
        licytujacyGracze.clear();
        // dodajemy graczy jako licytujacych
        for (int i=0;i<gracze.size();++i)
            licytujacyGracze.add(i);

        iloscKart = 52;
        karty.clear();
        for (int i=0;i<52;++i)
        {
            karty.add(i);
        }
        this.tasujKarty();


        // w nowej turze nastepna osoba jest dilerem
        diler = nastepnyGracz(diler);
        aktualnyLicytujacy = diler;//nastepnyGracz(diler);

    }

    public Integer ileNaStole()
    {
        Integer ile = 0;
        for (int i=0;i<gracze.size();++i)
        {
            ile += gracze.get(i).getStawka();
        }
        return ile;
    }
    
    public void zwiekszStawke(Integer ile)
    {
        this.stawka += ile;
    }
    
    public Integer getStawka()
    {
        return stawka;
    }


    public void setStawka(Integer stawka)
    {
        this.stawka = stawka;
    }
    
    public Integer getZwyciezca() {
        return zwyciezca;
    }

    public void setZwyciezca(Integer zwyciezca) {
        this.zwyciezca = zwyciezca;
    }

    public Integer nastepnyGracz(Integer i)
    {
        return (i+1) % gracze.size();
    }

    public void nastepnyLicytujacy()
    {
        int ilosc = licytujacyGracze.size();
        aktualnyLicytujacy = (aktualnyLicytujacy >= ilosc-1) ? 0 : aktualnyLicytujacy+1;
    }

    public Integer getLicytujacyGracz()
    {
        return licytujacyGracze.get(aktualnyLicytujacy);
    }

    @SuppressWarnings("element-type-mismatch")
    public void usunLicytujacego(Object o)
    {
        licytujacyGracze.remove(o);
        System.out.println("Pozostali gracze: ");
        for (int i=0;i<licytujacyGracze.size();++i)
        {
            int gracz = licytujacyGracze.get(i);
            System.out.println(gracze.get(gracz).getLogin());
        }
        
        int ilosc = licytujacyGracze.size();

        //tu usunalem slaba nierownosc na rzec silnej
        aktualnyLicytujacy = (aktualnyLicytujacy > ilosc-1) ? 0 : aktualnyLicytujacy;

    }
    
    public Integer iloscLicytujacych()
    {
        return licytujacyGracze.size();
    }
    public Integer iloscGraczy()
    {
        return gracze.size();
    }
    
    public Integer getDiler() {
        return diler;
    }

    public void setDiler(Integer diler) {
        this.diler = diler;
    }

    public void dodajGracza(Socket socket) throws IOException
    {
        gracze.add(new Gracz(socket));
    }

    public Gracz getGracz(Integer id)
    {
        return gracze.get(id);
    }
    public Vector<Gracz> getGracze() {
        return gracze;
    }
    
    public void tasujKarty()
    {
        Collections.shuffle(karty);
    }

    public void wypiszKarty()
    {
        ListIterator it = karty.listIterator();
        while (it.hasNext())
        {
            Object obiekt = it.next();
            System.out.println(obiekt+" ");
            //break;
        }
        System.out.println();
    }

    public Integer wezKarte()
    {
        --iloscKart;
        Integer karta = karty.get(iloscKart);
        karty.remove(iloscKart);
        return karta;
    }

    public void oddajKarte(Integer karta)
    {
        karty.add(0, karta);
        ++iloscKart;
    }
    public Integer getPulaWejsciowa() {
        return pulaWejsciowa;
    }

    public void setPulaWejsciowa(Integer pulaWejsciowa) {
        this.pulaWejsciowa = pulaWejsciowa;
    }
    
    public Integer getNumerTury() {
        return numerTury;
    }


    public Integer wybierzZwyciezce()
    {

        Integer numer = 0;
        Vector <Integer> tablica = new Vector<Integer>();
        Integer nHierarchia = -1;
        for (int i=0;i<licytujacyGracze.size();++i)
        {
            Integer numerGracza = licytujacyGracze.get(i);

            if (gracze.get(numerGracza).getHierachia() > nHierarchia)
            {
                nHierarchia = gracze.get(numerGracza).getHierachia();
                numer = numerGracza;
            }
        }
        for (int i=0;i<licytujacyGracze.size();++i)
        {
            Integer numerGracza = licytujacyGracze.get(i);            
            if (gracze.get(numerGracza).getHierachia() == nHierarchia)
            {
                tablica.add(numerGracza);
            }
        }
        
        Random generator = new Random();
        numer = generator.nextInt(tablica.size());
        
        System.out.println("Licytujacy gracze: ");
        System.out.println(tablica.toString());
        return tablica.get(numer);
    }
}
